﻿#pragma once
#include<stdio.h>
#include<locale.h>//切换为本地的头文件
#include<stdlib.h>
#include<Windows.h>
#include<time.h>
#include<stdbool.h>

//定义三个宽字符：分别表示围墙、蛇结点、食物
#define WCHAR L'口'
#define SNODE L'●'
#define FNODE L'★'
//定义蛇产生的初始位置
#define INITPOSX 26
#define INITPOSY 14
//定义一个宏
#define KEY_PRESS(VK) ((GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )
//定义一个蛇|食物的结点
typedef struct SnakeNode
{
	int x;
	int y;
	struct SnakeNode* next;
}SnakeNode,* pSnakeNode;
//枚举小涵的朝向
typedef enum SnakeDirection
{
	UP = 1,
	DOWN,
	LEFT,
	RIGHT
}SnakeDirect;
//枚举游戏的状态
typedef enum SnakeState
{
	OK = 0,
	KILL_WALL,
	KILL_SELF,
	END_GAME
}SnakeState;
//定义一个蛇的结构体
typedef struct Snake
{
	pSnakeNode _snake;  //蛇头指针
	pSnakeNode _food;   //食物指针
	SnakeDirect _direct;//蛇头方向
	SnakeState _state;  //游戏情况
	int foodweight;     //一个食物的得分
	int sleepweight;    //小涵移动的速度
	int score;          //得分
}SNAKE,*pSNAKE;
void TurnConsoleInfo();//改变控制台相关信息
void SetPos(int x,int y);//修改光标位置
void WelcomePlayer();//打印欢迎界面
void CreatMap();//创建地图
pSNAKE SnakeInit();//小涵的初始化
void GetFoodNode(pSNAKE snake);//产生食物的结点
void HelpExplat(pSNAKE snake);//在地图的右侧打印帮助信息
void TurnSnakeDirection(pSNAKE snake);//根据虚拟按键改变蛇的方向
pSnakeNode GetSnakeNode(pSNAKE snake);//产生蛇的下一步的结点
void JudgeGameState(pSNAKE snake, pSnakeNode nextnode);
bool JudgeFood(pSNAKE snake, pSnakeNode food);//判定下一步的结点是否为食物
void EATFOOD(pSNAKE snake, pSnakeNode food);//吃食物操作
void NOFOOD(pSNAKE snake, pSnakeNode food);//移动操作
//销毁操作+关闭音乐+日后完成
//历史分数+写入内存